BroadwayServer support for unix socket listening
authorDomenico Tortorella <dom.tortorella@gmail.com>
Thu, 14 Aug 2014 11:30:00 +0000 (13:30 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 15 Aug 2014 00:24:10 +0000 (20:24 -0400)
At the present time broadway listens only for TCP/IP incoming
display connections. This patch implements the support for listening
on unix domain sockets too, adding the broadway_server_on_unix_socket_new()
constructor and the commandline option --unixsocket [path] to broadwayd.

https://bugzilla.gnome.org/show_bug.cgi?id=734420

docs/reference/gtk/broadwayd.xml
gdk/broadway/broadway-server.c
gdk/broadway/broadway-server.h
gdk/broadway/broadwayd.c

index 14f7064c0c8f97bd8046855a707a719175be91ef..207b6c9f2f94d3f33d1edfebdfd7b153c17d779e 100644 (file)
@@ -32,6 +32,7 @@
 <command>broadwayd</command>
 <arg choice="opt">--port <replaceable>PORT</replaceable></arg>
 <arg choice="opt">--address <replaceable>ADDRESS</replaceable></arg>
+<arg choice="opt">--unixsocket <replaceable>ADDRESS</replaceable></arg>
 <arg choice="opt"><replaceable>:DISPLAY</replaceable></arg>
 </cmdsynopsis>
 </refsynopsisdiv>
@@ -80,6 +81,13 @@ openssl passwd -1  > ~/.config/broadway.passwd
       address, instead of the default <literal>http://127.0.0.1:<replaceable>PORT</replaceable></literal>.
       </para></listitem>
   </varlistentry>
+  <varlistentry>
+    <term>--unixsocket</term>
+    <listitem><para>Use <replaceable>ADDRESS</replaceable> as the unix domain socket
+      address. This option overrides <literal>--address</literal> and <literal>--port</literal>.
+      It is available only on Unix-like systems.
+      </para></listitem>
+  </varlistentry>
 </variablelist>
 </refsect1>
 
index fc97bf416cbf738f30e3c86b08d15a80bfda6210..86c6920e9c6596517d6a1fa9185bbcdbd410980d 100644 (file)
@@ -1270,6 +1270,52 @@ broadway_server_new (char *address, int port, GError **error)
   return server;
 }
 
+BroadwayServer *
+broadway_server_on_unix_socket_new (char *address, GError **error)
+{
+  BroadwayServer *server;
+  GSocketAddress *socket_address;
+
+  server = g_object_new (BROADWAY_TYPE_SERVER, NULL);
+  server->port = -1;
+  server->address = g_strdup (address);
+
+  if (address == NULL)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Unspecified unix domain socket address");
+      g_object_unref (server);
+      return NULL;
+    }
+  else
+    {
+      socket_address = g_unix_socket_address_new (address);
+      if (socket_address == NULL)
+       {
+         g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA, "Invalid unix domain socket address %s: ", address);
+         g_object_unref (server);
+         return NULL;
+       }
+      if (!g_socket_listener_add_address (G_SOCKET_LISTENER (server->service),
+                                         socket_address,
+                                         G_SOCKET_TYPE_STREAM,
+                                         G_SOCKET_PROTOCOL_DEFAULT,
+                                         G_OBJECT (server),
+                                         NULL,
+                                         error))
+       {
+         g_prefix_error (error, "Unable to listen to %s: ", server->address);
+         g_object_unref (socket_address);
+         g_object_unref (server);
+         return NULL;
+       }
+      g_object_unref (socket_address);
+    }
+
+  g_signal_connect (server->service, "incoming",
+                   G_CALLBACK (handle_incoming_connection), NULL);
+  return server;
+}
+
 guint32
 broadway_server_get_last_seen_time (BroadwayServer *server)
 {
index 1021e444515a62a8b6f4f39013df06b28eb19aa6..cbe656ed28e5a99fab2537be283dc885f032876d 100644 (file)
@@ -22,6 +22,8 @@ typedef struct _BroadwayServerClass BroadwayServerClass;
 BroadwayServer     *broadway_server_new                      (char             *address,
                                                              int               port,
                                                              GError          **error);
+BroadwayServer     *broadway_server_on_unix_socket_new       (char             *address,
+                                                             GError          **error);
 gboolean            broadway_server_has_client               (BroadwayServer   *server);
 void                broadway_server_flush                    (BroadwayServer   *server);
 void                broadway_server_sync                     (BroadwayServer   *server);
index 84f95eee3eaee349f3e8149588a52bb9f226f0b3..30448ac76f8bed1e6d900a0ec648bd7d27556a3e 100644 (file)
@@ -417,12 +417,16 @@ main (int argc, char *argv[])
   GSocketService *listener;
   char *path, *basename;
   char *http_address = NULL;
+  char *unixsocket_address = NULL;
   int http_port = 0;
   char *display;
   int port = 0;
   const GOptionEntry entries[] = {
     { "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
     { "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" },
+#ifdef G_OS_UNIX
+    { "unixsocket", 'u', 0, G_OPTION_ARG_STRING, &unixsocket_address, "Unix domain socket address", "ADDRESS" },
+#endif
     { NULL }
   };
 
@@ -486,7 +490,11 @@ main (int argc, char *argv[])
   if (http_port == 0)
     http_port = 8080 + port;
 
-  server = broadway_server_new (http_address, http_port, &error);
+  if (unixsocket_address != NULL)
+    server = broadway_server_on_unix_socket_new (unixsocket_address, &error);
+  else
+    server = broadway_server_new (http_address, http_port, &error);
+
   if (server == NULL)
     {
       g_printerr ("%s\n", error->message);